#include <iostream>
#include <pthread.h>
#include <string>
#include <cstdio>
#include <cstring>
#include <unistd.h>

// void* run(void* args)
// {
//     while(true)
//     {
//         std::cout<<"new thread,pid:"<<getpid()<<std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }
// int main()
// {
//     std::cout<<"我是一个进程:"<<getpid()<<std::endl;
    
//     pthread_t tid;
//     pthread_create(&tid,nullptr,run,(void*)"thread-1");

//     //主线程
//     while(true)
//     {
//         std::cout<<"main thread,pid:"<<getpid()<<std::endl;
//         sleep(1);
//     }
//     return 0;
// }

std::string toHex(pthread_t tid)
{
    //进程内的函数，线程共享
    char buffer[64];
    snprintf(buffer,sizeof(buffer),"0x%lx",tid);
    return buffer;
}

void* routine(void* args)
{
    std::string name=static_cast<const char*>(args);
    while(true)
    {
        //不加保护时，就是共享资源
        std::cout<<"我是新线程，我的名字是:"<<name<<",my tid is:"<<toHex(pthread_self())<<std::endl;
        sleep(1);
        //线程出现异常，可能会导致其他线程全部崩溃
    }
    //返回值也可以返回变量，数字，对象等
    // return (void*)10;//线程退出方式1：线程入口函数return,表示线程退出
    //exit(1)在任何地方调用时，表示进程退出
    pthread_exit((void*)10);
}

int main()
{
    //1.新线程和main线程谁先运行，不确定
    //2.线程创建出来，要对进程的时间片进行瓜分
    //传参问题：传递参数，可以使变量，数字，对象
    pthread_t tid;
    int n=pthread_create(&tid,nullptr,routine,(void*)"thread-1"); 

    //线程创建之后，也是要被等待和回收的
    //理由：1.类似僵尸进程的问题  2.为了知道新线程的执行结果
    void* ret=nullptr;
    int wait_result=pthread_join(tid,&ret);// 执行完毕，任务一定处理结束，结果变量一定已经被写入了
    if(wait_result!=0)
    {
        std::cout<<"wait thread error:"<<strerror(wait_result)<<std::endl;
        return 1;
    }
    std::cout<<"wait thread success"<<(long long int)ret<<std::endl;


    if(n!=0)
    {
        std::cout<<"create thread error:"<<strerror(n)<<std::endl;
        return 1;
    }

    while(true)
    {
        std::cout<<"我是main线程"<<std::endl;
        sleep(1);
    }

    return 0;
}